<?php

/**
 * \file
 * Classe d'un bloc de pagination.
 */

namespace pilar\Scaffolding /* \cond */ ; /* \endcond */
{

/**
 * Bloc de pagination.
 *
 * \since 24/03/2009
 * \author Dirk MARSKI <dirk.marski@gmail.com>
 */
abstract class Pagination extends \pilar\Blocks\Block {


/**
 * Liens liés au bloc. Servent à afficher les liens pour passer les pages.
 * 
 * \since 24/03/2009
 */
private $_links = array();


/**
 * Membres sur lesquels est appliqué la pagination du bloc à afficher.
 *
 * \since 24/03/2009
 */
protected $_members = array();


/**
 * Limite iinférieure actuelle d'affichage.
 *
 * \since 24/03/2009
 */
protected $_offset = 0;


/**
 * Offset ajouté dans le formulaire ?
 *
 * \since 24/03/2009
 */
private $_formOffsetAdded = false;


protected function loadDefaultParams() {
 parent::loadDefaultParams();

 $this->params->define(array(
  'paginationLength' => '20',  // Nombre d'éléments par pagination.
  'form' => false // Dans un formulaire ? Si oui, on donne le formulaire.
 ));
}


protected function initialize() {
 if (isset($_GET['offset'])) {
  $this->_offset = $_GET['offset'];
 } else if ($this->get('form') != false) {
  if ($this->get('form')->postVarValue('_offset_value') != '') {
   $this->_offset = $this->get('form')->postVarValue('_offset_value');
  }
 }

 parent::initialize();
}


/**
 * Ajouter le lien pour aller à la page suivante.
 *
 * \since 24/03/2009
 */
protected function addNextLink() {
 if ($this->get('form') == false) {
  $link = new \pilar\Links\Link(array(
    'name' => 'next',
    'label' => 'page suivante',
    'specificLink' => 'requestUri'
   ));
  $link->setParam(
   'offset',
   $this->_offset + $this->get('paginationLength')
  );
  $this->addLink($link);
 } else {
  $this->get('form')->appendAtom(
   new \pilar\Forms\Button(array(
    'name' => 'next_page',
    'label' => 'page suivante',
    'value' => 'next'
   ))
  );
  $this->addFormOffset();
 }
}


/**
 * Ajouter le lien pour aller à la page précédente.
 *
 * \since 24/03/2009
 */
protected function addPreviousLink() {
 if ($this->get('form') == false) {
  $link = new \pilar\Links\Link(array(
    'name' => 'previous',
    'label' => 'page précédente',
    'specificLink' => 'requestUri'
  ));
  $link->setParam(
   'offset',
   $this->_offset - $this->get('paginationLength')
  );
  $this->addLink($link);
 } else {
  $this->get('form')->appendAtom(
   new \pilar\Forms\Button(array(
    'name' => 'previous_page',
    'label' => 'page précédente',
    'value' => 'previous'
   ))
  );
  $this->addFormOffset();
 }
}


protected function actions() {
 parent::actions();

 if ($this->get('form') != false) {
  // Alias de code :
   $form = $this->get('form');

  if($form->postVarValue('next_page') == 'next') {
   $this->showNext();
  } else if ($form->postVarValue('previous_page') == 'previous') {
   $this->showPrevious();
  } else {
   $this->getMembers();
  }
 } else {
  $this->getMembers();
 }

 $this->loadLinks();
}


/**
 * Fonction qui permet d'afficher les éléments suivants.
 *
 * \since 24/03/2009
 */
protected function showNext() {
 $this->_offset += $this->get('paginationLength');
 $this->getMembers();
}


/**
 * Fonction qui d'afficher les éléments précédents.
 *
 * \since 24/03/2009
 */
protected function showPrevious() {
 $this->_offset -= $this->get('paginationLength');
 $this->getMembers();
}


/**
 * Fonction qui recupère les membres à afficher.
 *
 * \since 24/03/2009
 */
abstract protected function getMembers();


/**
 * Charge les liens utiles.
 *
 * \since 24/03/2009
 */
protected function loadLinks() {
 if ($this->_offset > 0) {
  $this->addPreviousLink();
 }
 // TODO : améliorer la condition d'insertion du lien suivant. Vérifier
 // s'il y a d'autres choses à afficher, pas seulement si la page est plaine.
 if (sizeof($this->_members) == $this->get('paginationLength')) {
  $this->addNextLink();
 }

 if ($this->get('form') != false) {
  if ($this->get('form')->isSearching) {
   $this->addLink(
    new \pilar\Links\Link(array(
     'name' => 'backToForm',
     'label' => 'retour au formulaire',
     'target' => ''
    ))
   );
  }
 }
}


public function buildContentRoot($domDoc) {
 $domPagination = $domDoc->createElement('Pagination');

 foreach($this->_links as $link) {
  $domPagination->appendChild($link->domNode($domDoc));
 }

 return $domPagination;
}


/**
 * Fonction qui permet d'ajouter un lien au bloc.
 *
 * \param $link Lien à ajouter.
 * \since 24/03/2009
 */
public function addLink($link) {
 $this->_links[] = $link;
}


/**
 * Fonction qui ajoute le offset dans un champs caché dans le formulaire.
 *
 * \since 24/03/2009
 */
private function addFormOffset() {
 if (!$this->_formOffsetAdded) {
  $offset = new \pilar\SimpleFormMembers\TextBox(array(
   'name' => '_offset',
   'hidden' => 'true'
  ));
  // On force le passage à un string pour couvrir le cas '0' :
  $offset->value = (string) $this->_offset;
  $this->get('form')->appendAtom($offset);
  $this->_formOffsetAdded = true;
 }
}


} // Class.

} // Namespace.

?>
